#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
// 线程取消处理函数
void cancel_task(void *arg)
{
    printf("线程被取消,执行取消处理函数\n");
    free(arg);
    printf("线程被取消,释放动态内存 %p\n", arg);
}

void *task(void *arg)
{
    // 分配堆空间
    int *p = malloc(sizeof(int));
    *p = 0;
    printf("线程启动分配动态内存 p=%p\n", p);
    pthread_cleanup_push(cancel_task, p);

    while (1)
    {
        printf("线程正在运行 *p=%d\n", (*p)++);
        if ((*p) == 10)
        {
            break;
        }
        sleep(1);
    }

    pthread_cleanup_pop(0);

    printf("线程正常结束 释放动态内存 %p\n", p);
    free(p);
    pthread_exit(NULL);
}
int main()
{

    // 创建一个线程
    pthread_t tid;
    pthread_create(&tid, NULL, task, NULL);

    while (1)
    {
        printf("输入任意键取消线程\n");
        getchar();
        pthread_cancel(tid); // 取消线程
    }
}